GtkWidget *child;
widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
- child = gtk_widget_pick (widget, x, y);
+ child = gtk_widget_pick (widget, x, y, 0);
if (gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture)) == GDK_BUTTON_SECONDARY)
{
GtkWidget *child;
widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
- child = gtk_widget_pick (widget, x, y);
+ child = gtk_widget_pick (widget, x, y, 0);
if (gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture)) == GDK_BUTTON_PRIMARY)
{
int l, t, i;
int pos;
- child = gtk_widget_pick (grid, x, y);
+ child = gtk_widget_pick (grid, x, y, 0);
if (!child)
{
GTK_PLACES_OPEN_NEW_WINDOW = 1 << 2
} GtkPlacesOpenFlags;
+typedef enum {
+ GTK_PICK_ALL = 1 << 0
+} GtkPickFlags;
+
#endif /* __GTK_ENUMS_H__ */
gint x,
gint y)
{
- GtkWidget *child = gtk_widget_pick (GTK_WIDGET (box), x, y);
+ GtkWidget *child = gtk_widget_pick (GTK_WIDGET (box), x, y, 0);
if (!child)
return NULL;
target = gtk_window_lookup_pointer_focus_implicit_grab (toplevel, device, sequence);
if (!target)
- target = gtk_widget_pick (toplevel_widget, x, y);
+ target = gtk_widget_pick (toplevel_widget, x, y, 0);
if (!target)
target = toplevel_widget;
if (event->any.type == GDK_BUTTON_RELEASE)
{
GtkWidget *new_target;
- new_target = gtk_widget_pick (GTK_WIDGET (toplevel), x, y);
+ new_target = gtk_widget_pick (GTK_WIDGET (toplevel), x, y, 0);
if (new_target == NULL)
new_target = GTK_WIDGET (toplevel);
gtk_synthesize_crossing_events (GTK_ROOT (toplevel), target, new_target, event,
{
GtkWidget *target;
- target = gtk_widget_pick (GTK_WIDGET (focus->toplevel), focus->x, focus->y);
+ target = gtk_widget_pick (GTK_WIDGET (focus->toplevel), focus->x, focus->y, 0);
if (target == NULL)
target = GTK_WIDGET (focus->toplevel);
gtk_pointer_focus_set_target (focus, target);
GtkRangePrivate *priv = gtk_range_get_instance_private (range);
GtkWidget *mouse_location;
- mouse_location = gtk_widget_pick (GTK_WIDGET (range), x, y);
+ mouse_location = gtk_widget_pick (GTK_WIDGET (range), x, y, 0);
if (mouse_location == priv->slider_widget && !priv->zoom)
{
"gtk-primary-button-warps-slider", &primary_warps,
NULL);
- mouse_location = gtk_widget_pick (widget, x, y);
+ mouse_location = gtk_widget_pick (widget, x, y, 0);
/* For the purposes of this function, we ignore fill and highlight and
* handle them like the trough */
if (!event_widget)
return NULL;
- picked_widget = gtk_widget_pick (event_widget, surface_x, surface_y);
+ picked_widget = gtk_widget_pick (event_widget, surface_x, surface_y, 0);
if (picked_widget != NULL)
gtk_widget_translate_coordinates (event_widget, picked_widget, surface_x, surface_y, widget_x, widget_y);
* @widget: the widget to query
* @x: X coordinate to test, relative to @widget's origin
* @y: Y coordinate to test, relative to @widget's origin
+ * @flags: Flags to influence what is picked
*
* Finds the descendant of @widget (including @widget itself) closest
* to the screen at the point (@x, @y). The point must be given in
* coordinate or %NULL if none.
**/
GtkWidget *
-gtk_widget_pick (GtkWidget *widget,
- gdouble x,
- gdouble y)
+gtk_widget_pick (GtkWidget *widget,
+ gdouble x,
+ gdouble y,
+ GtkPickFlags flags)
{
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
GtkWidget *child;
g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
- if (!gtk_widget_get_can_pick (widget) ||
- !_gtk_widget_is_sensitive (widget) ||
- !_gtk_widget_is_drawable (widget))
+ if (!_gtk_widget_is_drawable (widget))
return NULL;
+ if ((flags & GTK_PICK_ALL) == 0)
+ {
+ if (!gtk_widget_get_can_pick (widget) ||
+ !_gtk_widget_is_sensitive (widget))
+ return NULL;
+ }
+
switch (priv->overflow)
{
default:
{
GtkWidget *picked;
- picked = gtk_window_pick_popover (GTK_WINDOW (widget), x, y);
+ picked = gtk_window_pick_popover (GTK_WINDOW (widget), x, y, flags);
if (picked)
return picked;
}
graphene_point3d_interpolate (&p0, &p1, p0.z / (p0.z - p1.z), &res);
- picked = gtk_widget_pick (child, res.x, res.y);
+ picked = gtk_widget_pick (child, res.x, res.y, flags);
if (picked)
return picked;
}
gdouble x,
gdouble y);
GDK_AVAILABLE_IN_ALL
-GtkWidget * gtk_widget_pick (GtkWidget *widget,
- gdouble x,
- gdouble y);
+GtkWidget * gtk_widget_pick (GtkWidget *widget,
+ gdouble x,
+ gdouble y,
+ GtkPickFlags flags);
GDK_AVAILABLE_IN_ALL
void gtk_widget_add_controller (GtkWidget *widget,
cairo_rectangle_int_t *rect);
GtkWidget *
-gtk_window_pick_popover (GtkWindow *window,
- double x,
- double y)
+gtk_window_pick_popover (GtkWindow *window,
+ double x,
+ double y,
+ GtkPickFlags flags)
{
GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
GList *popovers;
x, y,
&dest_x, &dest_y);
- picked = gtk_widget_pick (popover->widget, dest_x, dest_y);
+ picked = gtk_widget_pick (popover->widget, dest_x, dest_y, flags);
if (picked)
return picked;
}
void gtk_window_maybe_update_cursor (GtkWindow *window,
GtkWidget *widget,
GdkDevice *device);
-GtkWidget * gtk_window_pick_popover (GtkWindow *window,
- double x,
- double y);
+GtkWidget * gtk_window_pick_popover (GtkWindow *window,
+ double x,
+ double y,
+ GtkPickFlags flags);
G_END_DECLS
gdk_surface_get_device_position (gtk_widget_get_surface (widget),
device, &x, &y, NULL);
- widget = gtk_widget_pick (widget, x, y);
+ widget = gtk_widget_pick (widget, x, y, 0);
}
return widget;
const float py = y;
GtkWidget *picked;
#if 1
- picked = gtk_widget_pick (widget, px, py);
+ picked = gtk_widget_pick (widget, px, py, 0);
#else
{
int dx, dy;